package com.zwh.se.oop.Interface_abstract;

import org.springframework.web.util.WebUtils;

/**
 * @author zwh
 * 抽象类和抽象方法的关系：
 * 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。
 */
public /*final*/ abstract class AbstractDemo extends WebUtils {
    //抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。
    public abstract void doSomething();

    public static void main(String[] args) {
        //抽象类,原则上不能使用new关键字来创建对象,它是用来让子类继承的。
        AbstractDemo  abstractDemo = new AbstractDemo() {
            @Override
            public void doSomething() {
                System.out.println("doSomething");
            }
        };
        abstractDemo.doSomething();

    }
}
//子类继承抽象类后,需要实现抽象类中没有实现的抽象方法,否则这个子类也要声明为抽象类
//子类只能继承一个父类
class Abstractd extends AbstractDemo{
    //这种将抽象方法覆写的形式被叫做实现,实现是一种特殊的重写,因为父类根本没有实现过
    @Override
    public void doSomething() {
        //code
    }
    /*
        重载和重写的区别：
        重载(overload)：在同一个类中，当方法名相同，形参列表不同的时候  多个方法构成了重载
        重写(override)：在不同的类中，子类对父类提供的方法不满意的时候，要对父类的方法进行重写。
        细化区别：
        重载：在同一个类中  与修饰符无关                  与返回值无关             参数必须不同  与抛出异常无关
        重写：在子类父类中  父类修饰符访问权限必须高于子类  父类返回值类型必须大于子类  参数必须相同  抛出异常必须小于等于父类
     */
    public void doSomething(int i) {
        System.out.println(i);
    }
}
